package com.loveto.service;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.Html;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.TextView;

import com.loveto.common.JsonUtils;
import com.loveto.common.StringCheck;
import com.loveto.constant.LovetoConstant;


public class LoginJoinActivity extends BaseActivity implements
View.OnClickListener, OnItemSelectedListener {
	
	// 사용하는 변수들
	private AlertDialog.Builder myAlert;
	private ProgressDialog progressDialog;
	private Intent intentMoveToPage;
	private boolean isOverlapIdChecked;
	private boolean isEmailInputDirect;
	private String verifiedID;
	private String deviceID;
	private String macAdress;
	private String userDeviceID;
	private String member_id;
	private String member_pw;
	private String member_gender;
	private String member_email;
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.loveto_login_join);
		
		Log.d("tag","가입시작~");
		//변수 초기화
		myAlert = new AlertDialog.Builder(this);
		myAlert.setNeutralButton("확인", null);
		progressDialog = new ProgressDialog(LoginJoinActivity.this);
		isOverlapIdChecked = false;
		isEmailInputDirect = false;
		verifiedID = "";
		((TextView)findViewById(R.id.link_terms)).setText(Html.fromHtml("<u>이용약관,</u>"));
		((TextView)findViewById(R.id.link_privacy)).setText(Html.fromHtml("<u>개인정보 취급방침</u>"));
		
		//클릭 리스너 등록
		((RelativeLayout)findViewById(R.id.btn_goto_back)).setOnClickListener(this);
		((TextView)findViewById(R.id.btn_check_overlap_id)).setOnClickListener(this);
		((RelativeLayout)findViewById(R.id.btn_join_new_ID)).setOnClickListener(this);
		((Spinner)findViewById(R.id.input_email_second)).setOnItemSelectedListener(this);
		((TextView)findViewById(R.id.link_terms)).setOnClickListener(this);
		((TextView)findViewById(R.id.link_privacy)).setOnClickListener(this);
		
		//얼럿 확인 눌렀을 때 처리
		myAlert.setOnItemSelectedListener(new OnItemSelectedListener() {
			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				// TODO Auto-generated method stub
			}
			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
				
			}
		});
		
		//아이디 중복 체크 후 다시 아이디 수정 시 처리
		EditText v_input_id = (EditText) findViewById(R.id.input_id);
		v_input_id.addTextChangedListener(new TextWatcher() {
			@Override
			public void onTextChanged(CharSequence s, int start, int before, int count) {
			}
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}
			@Override
			public void afterTextChanged(Editable s) {
				if (isOverlapIdChecked) {
					if (!verifiedID.equals(s.toString())) {
						isOverlapIdChecked = false;
						verifiedID = "";
						((TextView)findViewById(R.id.btn_check_overlap_id)).setBackgroundResource(R.drawable.btn_login_join_check_id);
					}
				}
			}
		});
		
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
			case R.id.btn_check_overlap_id:
				if (isNetworkAvailableAndNotice()) {
					checkOverlapID();
				}
				break;
			case R.id.btn_join_new_ID:
				if (isNetworkAvailableAndNotice()) {
					if (checkCorrectInput()) {
						showAlertJoin();
					}
				}
				break;
			case R.id.link_terms:
				intentMoveToPage = new Intent(LoginJoinActivity.this,LoginInfoTermsActivity.class);
				startActivity(intentMoveToPage);
				break;
			case R.id.link_privacy:
				intentMoveToPage = new Intent(LoginJoinActivity.this,LoginInfoPrivacyActivity.class);
				startActivity(intentMoveToPage);
				break;
			case R.id.btn_goto_back:
				finish();
				break;
		}
	}
	
	@Override
	public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
	// TODO Auto-generated method stub
		Log.d("tag","스피너 선택 함");
		Spinner v_input_email_second = (Spinner) findViewById(R.id.input_email_second);
		RelativeLayout input_email_second_direct_area = (RelativeLayout) findViewById(R.id.input_email_second_direct_area);
		String selectedItem = v_input_email_second.getSelectedItem().toString();
		if ("직접입력".equals(selectedItem)) {
			isEmailInputDirect = true;
			v_input_email_second.setVisibility(Spinner.GONE); //직접 입력 선택시 스피너 사라짐.
			input_email_second_direct_area.setVisibility(EditText.VISIBLE); //직접 입력 에디트 텍스트 보임.
		}
	}
	
	@Override
	public void onNothingSelected(AdapterView<?> arg0) {
		// TODO Auto-generated method stub
		Log.d("tag","아무것도 선택되지 않았슴다");
		return;
	}
	
	private void saveNewID() {
		//디바이스  ID (IMEI) 가져오기
		progressDialog.setMessage("유저정보를 저장하는 중입니다.");
		progressDialog.show();
		final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
		deviceID = "" + tm.getDeviceId();
		//와이파이 맥어드레스 가져오기
		final WifiManager wm = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
		WifiInfo winfo = wm.getConnectionInfo();
		macAdress = "" + winfo.getMacAddress();
		//디바이스 ID 는 IMEI or 맥어드래스 (전화 기능이 없는 갤탭 등에서도 사용 가능하도록)
		//http://blog.daum.net/han24_2/3041614 참고
		if (deviceID.length() > 5) { //IMEI 가 null 이 아니거나 어느정도 값이 있을 때
			userDeviceID = deviceID;
		} else {
			userDeviceID = macAdress; //IMEI 가 null 이거나 값이 너무 적으면 mac 어드레스로 대체 됨. 
		}
		member_id = ((EditText)findViewById(R.id.input_id)).getText().toString();
		member_pw = ((EditText)findViewById(R.id.inputPasswordFirst)).getText().toString();
		RadioButton v_radio_gender_man = (RadioButton)findViewById(R.id.radio_gender_man);
		RadioButton v_radio_gender_woman = (RadioButton)findViewById(R.id.radio_gender_woman);
		if (v_radio_gender_man.isChecked()) {
			member_gender = "M";
		} else if (v_radio_gender_woman.isChecked()) {
			member_gender = "F";
		}
		Log.d("tag", "checkOverlapIDfromServer start");
		try {
			//서버에 정보 보내기
			StringBuffer url = new StringBuffer(LovetoConstant.LOGIN_JOIN_NEW_ID);
			url.append("?member_id=").append(member_id);
			url.append("&member_pw=").append(URLEncoder.encode(member_pw, "UTF-8"));
			url.append("&member_gender=").append(member_gender);
			url.append("&member_email=").append(URLEncoder.encode(member_email, "UTF-8"));
			url.append("&phone_uid=").append(URLEncoder.encode(userDeviceID, "UTF-8"));
			Log.d("tag", "url : " + url.toString());
			String jsonText = JsonUtils.getStringFromUrl(url.toString());
			Log.d("tag", "jsonText : " + jsonText);
			//JSONArray jsonArray = new JSONArray(jsonText);
			JSONObject object = new JSONObject(jsonText);
			String result = object.getString("result");
			String err = object.getString("err");
			Log.d("tag", "result : " + result);
			Log.d("tag", "err : " + err);
			if ("F".equals(result)) {
				if ("registedPhone".equals(err)) {
					myAlert.setMessage("사용하시는 기기로 이미 다른 아이디가 가입되었습니다. 한 기기당 하나의 아이디만 가입 가능합니다.").show();
				} else if ("registedEmail".equals(err)) {
					myAlert.setMessage("이미 사용중인 이메일입니다. 다른 이메일 주소를 입력해주세요.").show();
				} else if ("DBInsertError".equals(err)) {
					myAlert.setMessage("정보 저장에 실패했습니다. 재시도해주세요!").show();
				}
			} else if ("T".equals(result)) {
				showAlertJoinSuccess();
			}
		} catch (JSONException e) {
			e.printStackTrace();
			Log.d("tag", "setRoundInfo() error, " + e.getMessage());
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			Log.d("tag", "setRoundInfo() error, " + e.getMessage());
		} finally {
			progressDialog.dismiss();
		}
		Log.d("tag", "checkOverlapIDfromServer end");
	}
	
	
	private boolean checkCorrectInput() {
		//아이디 중복체크 여부 확인 
		if (!isOverlapIdChecked) {
			myAlert.setMessage("아이디 중복체크를 해주세요.").show();
			return false;
		}
		
		String strPasswordFirst = ((EditText)findViewById(R.id.inputPasswordFirst)).getText().toString();
		String strPasswordSecond = ((EditText)findViewById(R.id.inputPasswordSecond)).getText().toString();
		if ("".equals(strPasswordFirst)) {
			myAlert.setMessage("비밀번호를 입력해주십시오.").show();
			return false;
		} else if ("".equals(strPasswordSecond)) {
			myAlert.setMessage("비밀번호 재입력을 입력해주십시오.").show();
			return false;
		}
		// 비밀번호 글자 길이에 대한 판단
		if (strPasswordFirst.length() < 4) {
			myAlert.setMessage("비밀번호는 4글자 이상이어야합니다.").show();
			return false;
		} else if (strPasswordFirst.length() > 12) {
			myAlert.setMessage("비밀번호는 최대 12글자입니다.").show();
			return false;
		}
		// 비밀번호 공백 여부 판단
		if (StringCheck.checkBlank(strPasswordFirst)) {
			myAlert.setMessage("비밀번호는 공백이있으면 안됩니다.").show();
			return false;
		}
		if (!(strPasswordFirst.equals(strPasswordSecond))) {
			myAlert.setMessage("비밀번호 첫입력과 재입력이 다릅니다.").show();
			return false;
		}
		//비밀번호 한글 포함 여부
		if	 (!StringCheck.checkCorrectPassword(strPasswordFirst)) {
			myAlert.setMessage("비밀번호는 영문과 특수문자만 사용해주세요.").show();
			return false;
		}
		
		//성별 입력 여부
		RadioButton v_radio_gender_man = (RadioButton)findViewById(R.id.radio_gender_man);
		RadioButton v_radio_gender_woman = (RadioButton)findViewById(R.id.radio_gender_woman);
		if (!v_radio_gender_man.isChecked()&&!v_radio_gender_woman.isChecked()) {
			myAlert.setMessage("본인의 성별을 선택해주세요.").show();
			return false;
		}
		
		//이메일 앞부분 입력 여부
		String strEmailFirst = ((EditText)findViewById(R.id.input_email_first)).getText().toString();
		if ("".equals(strEmailFirst)) {
			myAlert.setMessage("이메일 주소의 앞부분을 입력해주세요.").show();
			return false;
		} else {
			member_email = strEmailFirst; //이메일 주소저장 
		}
		//이메일 뒷부분 입력 여뷰
		Spinner v_input_email_second = (Spinner) findViewById(R.id.input_email_second);
		String selectedItem = v_input_email_second.getSelectedItem().toString();
		String strDirectInputEmail = ((EditText)findViewById(R.id.input_email_second_direct)).getText().toString();
		if ("메일선택".equals(selectedItem)) {
			myAlert.setMessage("이메일 주소의 뒷부분을 입력해주세요.").show();
			return false;
		}
		if (isEmailInputDirect) {
			if (!StringCheck.checkCorrectEmailSecond(strDirectInputEmail)) {
				myAlert.setMessage("이메일 주소의 뒷부분을 올바르게 입력해주세요.").show();
				return false;
			} else {
				member_email += "@";
				member_email += strDirectInputEmail;
			}
		} else {
			member_email += "@";
			member_email += selectedItem;
		}
		//이용약관 동의 확인
		CheckBox v_checkAgreeTerms = (CheckBox) findViewById(R.id.checkAgreeTerms);
		if (!v_checkAgreeTerms.isChecked()) {
			myAlert.setMessage("이용약관 및 개인정보 취급방침에 동의해주세요.").show();
			return false;
		}
		
		return true; //모든 입력 정보가 정상 임력 시 트루.
	}
	
	private void checkOverlapID() {
		progressDialog.setMessage("정보를 확인하는 중입니다.");
		progressDialog.show();
		Log.d("tag","checkOverlapID 1");
		String inputID = ((EditText)findViewById(R.id.input_id)).getText().toString();
		Log.d("tag","inputID:" + inputID);
		if (isOverlapIdChecked) {
			myAlert.setMessage("이미 중복체크하였습니다.").show();
			progressDialog.dismiss();
			return;
		}
		if (inputID.length()<3) {
			myAlert.setMessage("아이디는 3글자 이상이어야합니다.").show();
			progressDialog.dismiss();
			return;
		} else if (inputID.length()>8) {
			myAlert.setMessage("아이디는 8글자 이하이어야합니다.").show();
			progressDialog.dismiss();
			return;
		}
		Log.d("tag","checkOverlapID 3");
		if (StringCheck.checkBlank(inputID)) {
			myAlert.setMessage("아이디는 공백이있으면 안됩니다.").show();
			progressDialog.dismiss();
			return;
		}
		Log.d("tag","checkOverlapID 4");
		if (!StringCheck.checkCorrectID(inputID)) {
			myAlert.setMessage("아이디는 올바른 한글,영문,숫자로 작성해주세요.").show();
			progressDialog.dismiss();
			return;
		}
		
		try {
			//서버에 정보 보내기
			String userinfo_ID = ((EditText)findViewById(R.id.input_id)).getText().toString();
			StringBuffer url = new StringBuffer(LovetoConstant.LOGIN_CHECK_OVERLAP_ID);
			url.append("?userinfo_ID=").append(userinfo_ID);
			Log.d("tag", "url : " + url.toString());
			String jsonText = JsonUtils.getStringFromUrl(url.toString());
			Log.d("tag", "jsonText : " + jsonText);
			//JSONArray jsonArray = new JSONArray(jsonText);
			JSONObject object = new JSONObject(jsonText);
			String result = object.getString("result");
			String err = object.getString("err");
			Log.d("tag", "result : " + result);
			Log.d("tag", "err : " + err);
			if ("F".equals(result)) {
				myAlert.setMessage("이미 가입한 아이디입니다.").show();
				isOverlapIdChecked = false;
			} else if ("T".equals(result)) {
				myAlert.setMessage("사용 가능한 아이디입니다.").show();
				isOverlapIdChecked = true;
				verifiedID = userinfo_ID;
				//버튼 색상을 변경하기
				((TextView)findViewById(R.id.btn_check_overlap_id)).setBackgroundResource(R.drawable.btn_login_join_check_id_verified);
			}
		} catch (JSONException e) {
			e.printStackTrace();
			Log.d("tag", "setRoundInfo() error, " + e.getMessage());
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			Log.d("tag", "setRoundInfo() error, " + e.getMessage());
		} finally {
			progressDialog.dismiss();
		}
		Log.d("tag", "checkOverlapIDfromServer end");
	}
	
    private void showAlertJoin() {
		new AlertDialog.Builder(this)
		.setTitle("확인해주세요!")
		.setMessage("하나의 모바일 기기당 하나의 계정만 가입할 수 있습니다. 가입하시겠습니까?")
		.setPositiveButton("가입", new DialogInterface.OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				dialog.dismiss();
				if (isNetworkAvailableAndNotice()) {
					saveNewID();
				}
			}
		})
		.setNegativeButton("취소", new DialogInterface.OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				dialog.dismiss();
			}
		})
		.show();
    }
    
    private void showAlertJoinSuccess() {
    	new AlertDialog.Builder(this)
    	.setTitle("가입 성공!")
    	.setMessage("회원 가입에 성공했습니다. 새계정으로 로그인해보세요!")
    	.setPositiveButton("확인", new DialogInterface.OnClickListener()
    	{
    		@Override
    		public void onClick(DialogInterface dialog, int which)
    		{
    			dialog.dismiss();
    			finish();
    		}
    	})
    	.show();
    }
}
